// Copyright (c) ZeroC, Inc.

import IceImpl

class EndpointInfoFactory: ICEEndpointInfoFactory {
    static func createTCPEndpointInfo(
        _ handle: ICEEndpointInfo,
        underlying: Any,
        timeout: Int32,
        compress: Bool,
        host: String,
        port: Int32,
        sourceAddress: String
    ) -> Any {
        return TCPEndpointInfoI(
            handle: handle,
            underlying: getUnderlying(underlying),
            timeout: timeout,
            compress: compress,
            host: host,
            port: port,
            sourceAddress: sourceAddress)
    }

    static func createUDPEndpointInfo(
        _ handle: ICEEndpointInfo,
        underlying: Any,
        timeout: Int32,
        compress: Bool,
        host: String,
        port: Int32,
        sourceAddress: String,
        mcastInterface: String,
        mcastTtl: Int32
    ) -> Any {
        return UDPEndpointInfoI(
            handle: handle,
            underlying: getUnderlying(underlying),
            timeout: timeout,
            compress: compress,
            host: host,
            port: port,
            sourceAddress: sourceAddress,
            mcastInterface: mcastInterface,
            mcastTtl: mcastTtl)
    }

    static func createWSEndpointInfo(
        _ handle: ICEEndpointInfo,
        underlying: Any,
        timeout: Int32,
        compress: Bool,
        resource: String
    ) -> Any {
        return WSEndpointInfoI(
            handle: handle,
            underlying: getUnderlying(underlying),
            timeout: timeout,
            compress: compress,
            resource: resource)
    }

    static func createOpaqueEndpointInfo(
        _ handle: ICEEndpointInfo,
        underlying: Any,
        timeout: Int32,
        compress: Bool,
        encodingMajor: UInt8,
        encodingMinor: UInt8,
        rawBytes: Data
    ) -> Any {
        return OpaqueEndpointInfoI(
            handle: handle,
            underlying: getUnderlying(underlying),
            timeout: timeout,
            compress: compress,
            rawEncoding: EncodingVersion(major: encodingMajor, minor: encodingMinor),
            rawBytes: rawBytes)
    }

    static func createSSLEndpointInfo(
        _ handle: ICEEndpointInfo,
        underlying: Any,
        timeout: Int32,
        compress: Bool
    ) -> Any {
        return SSLEndpointInfoI(
            handle: handle,
            underlying: getUnderlying(underlying),
            timeout: timeout,
            compress: compress)
    }

    #if os(iOS) || os(watchOS) || os(tvOS)

        static func createIAPEndpointInfo(
            _ handle: ICEEndpointInfo,
            underlying: Any,
            timeout: Int32,
            compress: Bool,
            manufacturer: String,
            modelNumber: String,
            name: String,
            protocol: String
        ) -> Any {
            return IAPEndpointInfoI(
                handle: handle,
                underlying: getUnderlying(underlying),
                timeout: timeout,
                compress: compress,
                manufacturer: manufacturer,
                modelNumber: modelNumber,
                name: name,
                protocol: `protocol`)
        }

    #endif

    static func getUnderlying(_ info: Any) -> EndpointInfo? {
        return info as? EndpointInfo
    }
}
